Hadoop集成Ceph rgw存储
Hadoop与S3的集成可以参考官方说明。实际上对于AWS来说,只有s3协议,但是hadoop由于历史原因,逐步实现了s3->s3n->s3a三种访问S3服务的协议,支持的文件也越来越大。由于我们使用的是自建S3 Service,而只有s3a支持设置endpoint,虽然号称“仍有bug”,但也只能硬着头皮上了。
Hadoop配置S3集成
修改core-site.xml,增加如下配置:
分别说明下配置项的功能,这些选项在org.apache.hadoop.fs.s3a.Constants中有定义,后面spark集成S3时也会用到。
fs.s3a.access.key/fs.s3a.secret.key,即AK
fs.s3a.endpoint,即S3服务地址端口号,注意填写IP,不要用FQDN或者hostname,否则会报Caused by: java.net.UnknownHostException: xxx.zelda2。使用主机名的形式,会造成按AWS的方式来访问,即bucketname.awsxxx.com这种。
fs.s3a.connection.ssl.enabled,是否开启ssl,我们的S3服务使用http,需要填写为否。
fs.defaultFS, 只需要配置hive,yarn
配置完成后记得重启HDFS/YARN。
试一下文件上传下载好不好使:
注意fs -ls的时候,bucketname后面有个斜杠,不加会报错:ls: `s3a://xxx’: No such file or directory。 distcp可以把HDFS的文件拷贝到s3上去,当然更方便的是直接使用dfs -put。
再跑个MR:(这个我没有测试过,但是我测试了spark)
Signature V2/V4
由于hadoop的Signature是V2,而s3cmd用的是V4,需要加上参数
而Ceph支持V2,使用1.7.4的aws-java-sdk去访问Ceph S3 Service是正常的。